package day48;

// 顺时针打印矩阵
// 注意一点：顺时针打印打印所有，但是其实就是从外圈向里面顺时针打印
// 所以每次打印一圈之后都要进行变换
// 注意赋值的变量！！

public class Main2 {
    public int[] clockwisePrint(int[][] mat, int n, int m) {
        // write code here
        int startX = 0;
        int endX = m-1;
        int startY = 0;
        int endY = n-1;
        int[] ret = new int[n*m]; // 存储最后的顺时针矩阵
        int index = 0;
        while (startX<=endX && startY<=endY) {
            // 首行从左到右
            if(startX <= endX) {
                for (int i = startX; i <= endX; i++) {
                    ret[index++] = mat[startY][i];
                }
            }

            // 模列从上到下
            if(startY < endY) { // 注意
                for (int i = startY+1; i <= endY; i++) { // 注意跳到下一行
                    ret[index++] = mat[i][endX]; // 注意：是末尾巴
                }
            }

            // 末行从右到左
            if(startX<endX && startY<endY) {
                for (int i = endX-1; i >= startX; i--) { // 注意：这里的endX需要进行--,因为那个已经加入过
                    ret[index++] = mat[endY][i];
                }
            }

            // 首列从下到上
            if(startX<endX && startY<endY) {
                for (int i = endY-1; i > startY; i--) { // 注意：这里的endX需要进行--,并且开始的已经加入过
                    ret[index++] = mat[i][startX];
                }
            }

            // 坐标变换（开始下一圈）
            startX++;
            endX--;
            startY++;
            endY--;
        }
        return ret;
    }
}
